﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aquasoft.Iszr.Proxy.WebServices.Interfaces;
using Aquasoft.Iszr.Proxy.WebServices;

namespace Aquasoft.Iszr.Proxy.ZadostInfoUtils
{
    /// <summary>
    /// Scope pro vyplnění ZadostInfo pomocí předvyplněných hodnost.
    /// Podporuje vnořování (nejvnořenější NOT NULL hodnota vyhrává)
    /// Umí exportovat data pro přenos na server a tam vytvoření nového scope.
    /// Do statické property DEFAULT_DATA lze přednastavit default data pro vyplnění (který koli scope je může overridovat)
    /// </summary>
    public class IszrZadostInfoScope : IszrZadostInfoScopeBase
    {
        #region DefaultData

        private static IszrZadostInfoData __defaultData;
        public static IszrZadostInfoData DEFAULT_DATA
        {
            get { return __defaultData; }
        }

        internal static void SetDefaultData(IszrZadostInfoData data)
        {
            __defaultData = data;
        }

        public static IszrZadostInfoData GetCurrentData(bool mergeWithDefaultData = false)
        {
            IszrZadostInfoScopeBase scope = IszrZadostInfoManager.CurrentScope;
            while (scope != null)
            {
                var ts = scope as IszrZadostInfoScope;
                if (ts != null)
                    return ts.GetData(mergeWithDefaultData);

                scope = scope.Parent;
            }

            if (mergeWithDefaultData)
                return DEFAULT_DATA;
            
            return null;
        }

        #endregion

        private readonly IszrZadostInfoData __data;
        protected IszrZadostInfoData CurrentData
        {
            get { return __data; }
        }

        public IszrZadostInfoScope(IszrZadostInfoData data = null)
        {
            __data = data ?? new IszrZadostInfoData();
        }

        public IszrZadostInfoData GetData(bool mergeWithDefaultData = true)
        {
            // data
            var data = new IszrZadostInfoData();

            // tree
            {
                IszrZadostInfoScopeBase scope = this;
                while (scope != null)
                {
                    var ts = scope as IszrZadostInfoScope;
                    if (ts != null)
                        MergeData(data, ts.__data);

                    scope = scope.Parent;
                }
            }

            // default
            if (mergeWithDefaultData)
            {
                var defaultData = __defaultData;
                if (defaultData != null)
                    MergeData(data, defaultData);
            }

            // result
            return data;
        }

        protected virtual void MergeData(IszrZadostInfoData data, IszrZadostInfoData from)
        {
            data.Agenda = data.Agenda ?? from.Agenda;
            data.AgendovaRole = data.AgendovaRole ?? from.AgendovaRole;
            data.Ais = data.Ais ?? from.Ais;
            data.Subjekt = data.Subjekt ?? from.Subjekt;
            data.DuvodUcel = data.DuvodUcel ?? from.DuvodUcel;
            data.Ovm = data.Ovm ?? from.Ovm;
        }

        protected override void SetupZadostInfo(ISzrZadostInfo request, ZadostInfoType zadostInfo)
        {
            base.SetupZadostInfo(request, zadostInfo);

            var data = GetData(true);

            zadostInfo.Agenda = data.Agenda;
            zadostInfo.AgendovaRole = data.AgendovaRole;
            zadostInfo.Ais = data.Ais;
            zadostInfo.Subjekt = data.Subjekt;
            zadostInfo.DuvodUcel = data.DuvodUcel;
            zadostInfo.Ovm = data.Ovm;
        }
    }
}
